From 5bd0ec6381f7c2412e540d4b23c1152081bb5292 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 27 Apr 2015 22:56:53 -0400 Subject: [PATCH] GtkBuilder: Report 'invalid ID' errors Look for a stashed GError after calling custom_tag_end, custom_finished or parser_finished vfuncs, and report them up. --- gtk/gtkbuilderparser.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index 3a42044882..d90038a434 100644 --- a/gtk/gtkbuilderparser.c +++ b/gtk/gtkbuilderparser.c @@ -941,13 +941,20 @@ subparser_end (GMarkupParseContext *context, ParserData *data, GError **error) { + GError *lookup_error; + if (data->subparser->parser->end_element) data->subparser->parser->end_element (context, element_name, data->subparser->data, error); + if (*error) + return; + if (strcmp (data->subparser->start, element_name) != 0) return; + g_object_set_data (G_OBJECT (data->builder), "lookup-error", NULL); + gtk_buildable_custom_tag_end (GTK_BUILDABLE (data->subparser->object), data->builder, data->subparser->child, @@ -955,6 +962,13 @@ subparser_end (GMarkupParseContext *context, data->subparser->data); g_free (data->subparser->parser); + lookup_error = (GError*) g_object_steal_data (G_OBJECT (data->builder), "lookup-error"); + if (lookup_error) + { + g_propagate_error (error, lookup_error); + return; + } + if (GTK_BUILDABLE_GET_IFACE (data->subparser->object)->custom_finished) data->custom_finalizers = g_slist_prepend (data->custom_finalizers, data->subparser); @@ -1385,20 +1399,41 @@ _gtk_builder_parser_parse_buffer (GtkBuilder *builder, for (l = data->custom_finalizers; l; l = l->next) { SubParser *sub = (SubParser*)l->data; - + GError *lookup_error; + + g_object_set_data (G_OBJECT (builder), "lookup-error", NULL); + gtk_buildable_custom_finished (GTK_BUILDABLE (sub->object), builder, sub->child, sub->tagname, sub->data); + + lookup_error = (GError*) g_object_steal_data (G_OBJECT (builder), "lookup-error"); + if (lookup_error) + { + g_propagate_error (error, lookup_error); + goto out; + } } - + /* Common parser_finished, for all created objects */ data->finalizers = g_slist_reverse (data->finalizers); for (l = data->finalizers; l; l = l->next) { GtkBuildable *buildable = (GtkBuildable*)l->data; + GError *lookup_error; + + g_object_set_data (G_OBJECT (builder), "lookup-error", NULL); + gtk_buildable_parser_finished (GTK_BUILDABLE (buildable), builder); + + lookup_error = (GError*) g_object_steal_data (G_OBJECT (builder), "lookup-error"); + if (lookup_error) + { + g_propagate_error (error, lookup_error); + goto out; + } } out: -- 2.30.2